from datetime import datetime

from django import http
from django.shortcuts import render

# Create your views here.
from django.views import View

from apps.contents.utils import get_categories
from apps.goods.models import GoodsCategory, SKU, GoodsVisitCount
from apps.goods.utils import get_breadcrumb
from utils.response_code import RETCODE
#记录访问量
# class DetailVisitView(View):
#     def post(self,request,category_id):
#         #1.接收 校验参数
#         try:
#             category = GoodsCategory.objects.get(id=category_id)
#         except Exception as e:
#             return http.HttpResponseBadRequest("商品不存在！")
#
#         #2.日期格式化的原因 ：datetime.now()英文 时分秒  年月日
#         date_str = datetime.now().strftime("%Y-%m-%d")
#         date_today = datetime.strptime(date_str,"%Y-%m-%d")
#         #3. 带着日期category_id 去查询当天  有没有访问记录
#         try:
#             # goods_visit = GoodsVisitCount.objects.get(category=category,date=date_today)
#             goods_visit =category.goodsvisitcount_set.get(date=date_today)
#         except Exception as e:
#             # 4.如果没有  新建一条记录
#             goods_visit = GoodsVisitCount()
#         #5.count += 1 save()
#         goods_visit.count += 1
#         goods_visit.category = category
#         goods_visit.save()
#         # 6.返回结果
#         return http.JsonResponse({"code":RETCODE.OK,"errmsg":"OK"})
class DetailVisitView(View):
    def post(self, request, category_id):
        # 1.接收 校验参数
        try:
            category = GoodsCategory.objects.get(id=category_id)
        except Exception as e:
            return http.HttpResponseBadRequest('商品不存在!')

        # 2.日期格式化的原因: datetime.now() 英文 时分秒;  年月日
        date_str = datetime.now().strftime('%Y-%m-%d')
        date_today = datetime.strptime(date_str, '%Y-%m-%d')
        # 3.带着日期 category_id 去查询当天 有没有访问记录
        try:
            # goods_visit = GoodsVisitCount.objects.get(category=category, date=date_today)
            goods_visit = category.goodsvisitcount_set.get(date=date_today)
        except Exception as e:
            print(e)
            # 4. 如果没有 新建一条记录
            goods_visit = GoodsVisitCount()
        # 5. count += 1 save()
        goods_visit.count += 1
        goods_visit.category = category
        goods_visit.save()
        # 6. 返回结果
        return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK'})
#详情页
class DetailView(View):
    def get(self, request, sku_id):
        #获取当前sku的信息
        try:
            sku = SKU.objects.get(id=sku_id)
        except SKU.DoesNotExist:
            return render(request, "404.html")
        #查询商品频道分类
        categories = get_categories()
        #查询面包屑导航
        breadcrumb = get_breadcrumb(sku.category_id)
        #构建当前商品的规格键
        sku_specs = sku.specs.order_by("spec_id")
        sku_key = []
        for spec in sku_specs:
            sku_key.append(spec.option.id)
        #获取当前商品的所有SKU
        skus = sku.spu.sku_set.all()
        #构建不同规格参数（选项）的sku字典
        spec_sku_map={}
        for s in skus:
            #获取sku的规格参数
            s_specs = s.specs.order_by("spec_id")
            #用于形成规格参数-sku字典的键
            key = []
            for spec in s_specs:
                key.append(spec.option.id)
            #向规格参数-sku字典添加记录
            spec_sku_map[tuple(key)]=s.id
        #获取当前商品的规格信息
        goods_specs = sku.spu.specs.order_by("id")
        #若当前sku的规格不完整，则不再继续
        if len(sku_key)<len(goods_specs):
            return
        for index, spec in enumerate(goods_specs):
            #复制当前sku的规格键
            key = sku_key[:]
            #该规格的选项
            spec_options = spec.options.all()
            for option in spec_options:
                #在规格参数SKU字典中查找符合当前规格的sku
                key[index] = option.id
                option.sku_id = spec_sku_map.get(tuple(key))
            spec.spec_options = spec_options
        #渲染页面
        context = {
            "categories":categories,
            "breadcrumb":breadcrumb,
            "sku":sku,
            "specs":goods_specs,

        }
        return render(request,"detail.html",context)

class HotView(View):
    def get(self,request,category_id):
        #热销排行
        #1.获取-sales 前两个
        skus = SKU.objects.filter(is_launched=True).order_by("-sales")[:2]
        #2.构建前端需要的数据格式
        hot_skus = []
        for sku in skus:
            hot_skus.append({
                "id":sku.id,
                "default_image_url":sku.default_image.url,
                "name":sku.name,
                "price":sku.price
            })
        return http.JsonResponse({"code":RETCODE.OK,"errmsg":"OK","hot_skus":hot_skus})

class ListView(View):
    def get(self,request,category_id,page_num):
        #1.三级商品分类
        categories = get_categories()
        #2.面包屑组件
        category = GoodsCategory.objects.get(id=category_id)
        breadcrumb = get_breadcrumb(category_id)
        #3.列表数据 排序
        #default price hot
        sort = request.GET.get("sort")
        if sort == "hot":
            sort_field = "-sales"
        elif sort == "price":
            sort_field = "price"
        else:
            sort_field = "create_time"
        skus = SKU.objects.filter(category_id = category_id,is_launched=True).order_by(sort_field)
        #4.分页
        #4.1 每页显示  几个
        from django.core.paginator import Paginator
        paginator = Paginator(skus,5)
        #4.2 总页数
        total_page = paginator.num_pages
        #4.3 当前页的商品
        page_skus = paginator.page(page_num)
        #5.热销排行
        context = {
            "categories":categories,
            "breadcrumb":breadcrumb,
            "sort":sort,
            "category":category,
            "page_skus":page_skus,
            "total_page":total_page,
            "page_num":page_num,
        }
        return render(request,"list.html",context)
